home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Very Best of Atari Inside
/
The Very Best of Atari Inside 1.iso
/
mint
/
mgr_2
/
src
/
atari
/
blit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-09-23
|
5KB
|
202 lines
/* Copyright (c) 1987 Bellcore
* All Rights Reserved
* Permission is granted to copy or use this program, EXCEPT that it
* may not be sold for profit, the copyright notice must be reproduced
* on copies, and credit should be given to Bellcore where it is due.
* BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
*/
/* $Header: blit.c,v 4.1 88/06/21 13:07:59 bianchi Exp $
$Source: /tmp/mgrsrc/src/oblit/RCS/blit.c,v $
*/
static char RCSid_[] = "$Source: /tmp/mgrsrc/src/oblit/RCS/blit.c,v $$Revision: 4.1 $";
/* stub bitblit code */
#include "bitmap.h"
#include <linea.h>
extern char *_scrnbase;
extern int _scrwidth, _scrheight, _scrplanes;
/* the atari hardware expects SRC==0x3, DST==0x05, so we have to convert
the MGR standards here
*/
static char __atari[16] = {
0, 0x8, 4, 0xc,
2, 0xa, 6, 0xe,
1, 9, 5, 0xd,
3, 0xb, 7, 0xf
};
static char nsrc[16] = { /* fold no source cases */
0,0,0,0,
0xf&~DST, 0xf&~DST, 0xf&~DST, 0xf&~DST,
0xf&DST, 0xf&DST, 0xf&DST, 0xf&DST,
0xf, 0xf, 0xf, 0xf
};
/*
* General memory-to-memory rasterop
*/
mem_rop(dest, dx, dy, width, height, func, source, sx, sy)
int sx, sy, dx, dy; /* properly clipped source and dest */
int width, height; /* rectangle to be transferred */
BITMAP *source, *dest; /* bit map pointers */
int func; /* rasterop function */
{
BBPB b;
int mindx, mindy, i;
int srcnxln, dstnxln;
int srcnxwd, dstnxwd;
bzero(&b, sizeof(b));
#ifndef NOCLIP
if (width < 0) {
dx += width;
width = -width;
}
if (height < 0) {
dy += height;
height = -height;
}
if (dx < 0) {
sx -= dx;
width += dx;
dx = 0;
}
if (dy < 0) {
sy -= dy;
height += dy;
dy = 0;
}
if (source) {
if (sx < 0) {
dx -= sx;
width += sx;
sx = 0;
}
if (sy < 0) {
dy -= sy;
height += sy;
sy = 0;
}
if ((i = sx + width - source->wide) > 0)
width -= i;
if ((i = sy + height - source->high) > 0)
height -= i;
}
if ((i = dx + width - dest->wide) > 0)
width -= i;
if ((i = dy + height - dest->high) > 0)
height -= i;
if (width < 1 || height < 1)
return -1;
#endif
if (source) {
if (IS_SCREEN(source)) {
srcnxwd = __aline->_VPLANES + __aline->_VPLANES;
srcnxln = __aline->_VWRAP;
}
else {
srcnxwd = HI_NXWD;
srcnxln = BIT_LINE(source) << 2;
}
}
if (IS_SCREEN(dest)) {
dstnxwd = __aline->_VPLANES + __aline->_VPLANES;
dstnxln = __aline->_VWRAP;
}
else {
dstnxwd = HI_NXWD;
dstnxln = BIT_LINE(dest) << 2;
}
b.bb_b_wd = width;
b.bb_b_ht = height;
b.bb_plane_ct = IS_SCREEN(dest) ? _scrplanes : 1;
b.bb_fg_col = 0xf;
b.bb_bg_col = 0;
func = OPCODE(func);
if (source) {
b.bb_op_tab.fg0bg0 =
b.bb_op_tab.fg0bg1 =
b.bb_op_tab.fg1bg0 =
b.bb_op_tab.fg1bg1 = __atari[func];
b.bb_s.bl_xmin = source->x0 + sx;
b.bb_s.bl_ymin = source->y0 + sy;
b.bb_s.bl_nxwd = srcnxwd;
b.bb_s.bl_nxpl =
(IS_SCREEN(source) && IS_SCREEN(dest)) ? 2 : 0;
b.bb_s.bl_nxln = srcnxln;
b.bb_s.bl_form = (char *)source->data;
}
else {
b.bb_op_tab.fg0bg0 =
b.bb_op_tab.fg0bg1 =
b.bb_op_tab.fg1bg0 =
b.bb_op_tab.fg1bg1 = __atari[nsrc[func]];
b.bb_s.bl_form = (char *)0xabcdef00;
}
b.bb_d.bl_xmin = mindx = dest->x0 + dx;
b.bb_d.bl_ymin = mindy = dest->y0 + dy;
b.bb_d.bl_form = (char *)dest->data;
b.bb_d.bl_nxwd = dstnxwd;
b.bb_d.bl_nxln = dstnxln;
b.bb_d.bl_nxpl = 2;
b.bb_p_addr = 0;
linea7(&b);
}
#if 0
/*
* function to copy the (one plane) screen image to the physical screen
*/
void
_update_screen(source, minx, maxx, miny, maxy)
BITMAP *source;
int minx, maxx, miny, maxy;
{
BBPB b;
if (_need_updates == 0)
return;
if (!IS_SCREEN(source))
return;
if (minx >= maxx || miny >= maxy)
return;
bzero(&b, sizeof(b));
b.bb_b_wd = (maxx - minx);
b.bb_b_ht = (maxy - miny);
b.bb_plane_ct = 1;
b.bb_fg_col = 3;
b.bb_bg_col = 0;
b.bb_op_tab.fg0bg0 =
b.bb_op_tab.fg0bg1 =
b.bb_op_tab.fg1bg0 =
b.bb_op_tab.fg1bg1 = S_ONLY;
b.bb_s.bl_xmin = minx;
b.bb_s.bl_ymin = miny;
b.bb_s.bl_nxwd = HI_NXWD;
b.bb_s.bl_nxpl = 2;
b.bb_s.bl_nxln = BIT_Size(source->wide, 1, 1);
b.bb_s.bl_form = (char *)source->data;
b.bb_d.bl_xmin = minx;
b.bb_d.bl_ymin = miny;
b.bb_d.bl_nxwd = __aline->_VPLANES * 2;
b.bb_d.bl_nxln = __aline->_VWRAP;
b.bb_d.bl_nxpl = 2;
b.bb_d.bl_form = _scrnbase;
b.bb_p_addr = 0;
linea7(&b);
}
#endif